﻿using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

namespace OnlineStore
{
    /// <summary>
    /// 配置数据操作类
    /// </summary>
    public class DataController
    {
        private JArray tasksConfig;
        private JObject userConfig;
        private JObject taobaoPathConfig;
        private JObject tianmaoPathConfig;
        private JObject pinduoduoPathConfig;
        private JObject pwSettingConfig;
        private JObject settingConfig;
        private FilePath filePath;
        private List<string> carPic;
        public Action<string> Print { get; set; }

        /// <summary>
        /// 获取车型图片名称列表
        /// </summary>
        public List<string> CarPic { get => carPic; }
        /// <summary>
        /// 获取浏览器导航
        /// </summary>
        public JObject TaobaoPathConfig { get => taobaoPathConfig; }
        /// <summary>
        /// 获取playwright设置
        /// </summary>
        public JObject PwSettingConfig { get => pwSettingConfig; }
        /// <summary>
        /// 获取宝贝发布设置
        /// </summary>
        public JObject SettingConfig { get => settingConfig; }
        
        /// <summary>
        /// 文件地址工具类
        /// </summary>
        public FilePath FilePath { get => filePath; }

        public DataController(FilePath filePath)
        {
            this.userConfig = ParseJson.ReadJObject(filePath.userConfig);
            this.pwSettingConfig = ParseJson.ReadJObject(filePath.pwSttingConfig);
            this.taobaoPathConfig = ParseJson.ReadJObject(filePath.taobaoNavigation);
            this.tianmaoPathConfig = ParseJson.ReadJObject(filePath.tianmaoNavigation);
            this.pinduoduoPathConfig = ParseJson.ReadJObject(filePath.pinduoduoNavigation);
            this.tasksConfig = ParseJson.ReadJArray(filePath.tasksConfig);
            this.settingConfig = ParseJson.ReadJObject(filePath.settingConfig);
            this.carPic = ParseFile.GetFileLines(filePath.carPic);
        }

        /// <summary>
        /// 获取任务列表
        /// </summary>
        /// <returns>任务列表</returns>
        public List<PlayerTask> GetPlayerTask(bool isCheck)
        {
            List<PlayerTask> tasklist = new List<PlayerTask>();
            PlayerTask playerTask;
            JToken jUser;
            foreach (var task in this.tasksConfig)
            {
                // 如果没有配置任务类型，就不会执行生成对应的任务对象，也就是不会运行对应的任务脚本
                if (!string.IsNullOrEmpty(task["类型"].ToString()))
                {
                    playerTask = new PlayerTask();
                    // -----------------上版设置-----------------
                    // 标题文件目录
                    playerTask.RootPath = this.SettingConfig["标题文件目录"].ToString();
                    // 标题文件
                    playerTask.TitlePath = $"{playerTask.RootPath}\\{task["标题文件"]}.txt";
                    // LOG文件
                    playerTask.LogPath = $"{playerTask.RootPath}\\log\\log_{task["标题文件"]}.txt";
                    ParseFile.CheckDir($"{playerTask.RootPath}\\log");
                    // 网店发布间隔
                    playerTask.TimeInterval = Int32.Parse(this.SettingConfig["网店发布间隔"].ToString());
                    // 发布延迟
                    playerTask.Delay = Int32.Parse(this.SettingConfig["发布延迟"].ToString());
                    // 保存登录
                    playerTask.Save = Int32.Parse(this.SettingConfig["保存登录"].ToString());
                    // 标题延迟
                    playerTask.TitleDelay = Int32.Parse(this.SettingConfig["标题延迟"].ToString());
                    // 统一发布数量，如果设置了单独发布数量，则优先使用单独发布数量
                    playerTask.Count = Int32.Parse(this.SettingConfig["发布数量"].ToString());
                    // -----------------任务设置-----------------
                    // 单个发布数量，优先级大于统一发布数量，配置数量为空则按统一数量来发布
                    if (!string.IsNullOrEmpty(task["发布数量"].ToString()))
                    {
                        playerTask.Count = Int32.Parse(task["发布数量"].ToString());
                    }
                    // 发布类型
                    playerTask.Type = task["类型"].ToString();
                    // 上版账号ID
                    playerTask.Id = task["账号ID"].ToString(); 
                    // 模板宝贝ID，如果是PDD，需要配置成模板宝贝连接
                    playerTask.ModelBaby = task["模板宝贝"].ToString();
                    // 如果需要使用之前的登录记录登录的话，需要配置已经保存的token文件，配置为空，则不使用登录记录
                    playerTask.Cookie = task["登录记录"].ToString();
                    // 图片名称列表
                    playerTask.PicList = CarPic;
                    // -----------------账号设置-----------------
                    jUser = this.GetUserForId(playerTask.Id);
                    // 网店账号
                    playerTask.User = jUser[0].ToString();
                    // 检查异常截图文件夹，并清理上一次的截图
                    playerTask.OtherName = playerTask.User;
                    // 检查异常截图文件夹是否存在
                    ParseFile.CheckDir(playerTask.ErrPicPath, true);
                    // 删除异常截图提醒文件
                    ParseFile.CheckDel(playerTask.ErrTxtPath);
                    // 网店密码
                    playerTask.Password = jUser[1].ToString();
                    // 宝贝标题列表
                    playerTask.TitleList = ParseFile.GetFileLines(playerTask.TitlePath);
                    // 如果标题数量为0，不添加进任务列表中
                    if (playerTask.TitleList.Count == 0 )
                    {
                        string contents =
                             "**************************************************\n" +
                            $"账号：{playerTask.User}，标题文件：{playerTask.TitlePath}，info: 标题数量为 0\n" +
                             "**************************************************\n";

                        Print(contents);
                        continue;
                    }
                    // 如果标题数量小于发布数量，设置发布数量为标题数量
                    if (playerTask.TitleList.Count < playerTask.Count)
                    {
                        playerTask.Count = playerTask.TitleList.Count;
                    }
                    if (isCheck)
                    {
                        playerTask.Count = Int32.Parse(this.SettingConfig["稳定测试"].ToString());
                        Print($"执行稳定测试：{playerTask.Count}");
                    }
                    // 图片名称和标题一对一绑定
                    foreach (string pic in playerTask.PicList)
                    {
                        foreach (string title in playerTask.TitleList)
                        {
                            if (title.Contains(pic))
                            {
                                playerTask.CarMap[pic] = title;
                                break;
                            }
                        }
                    }
                    // playwright 初始化设置
                    playerTask.PwSettingConfig = this.PwSettingConfig;
                    // 根据不同的网店类型生成不同的网页导航脚本
                    switch (playerTask.Type)
                    {
                        case "淘宝":
                            playerTask.PathConfig = this.taobaoPathConfig;
                            break;
                        case "天猫":
                            playerTask.PathConfig = this.tianmaoPathConfig;
                            break;
                        case "拼多多":
                            playerTask.PathConfig = this.pinduoduoPathConfig;
                            break;
                        default:
                            playerTask.PathConfig = this.taobaoPathConfig;
                            break;
                    }
                    tasklist.Add(playerTask);
                }
            }
            return tasklist;
        }

        /// <summary>
        /// 检查所有配置文件内容是否存在异常
        /// </summary>
        /// <returns>无异常返回true</returns>
        public bool CheckAllConfig()
        {
            FieldInfo[] fieldInfo = typeof(DataController).GetFields();
            bool okKey = true;
            foreach (FieldInfo field in fieldInfo) 
            {
                if (field == null) 
                {
                    Print($"【 Erro: {field.Name} 内容为空 】");
                    okKey = false;
                }
            }
            return okKey;
        }

        /// <summary>
        /// 通过账号ID获取账号数据
        /// </summary>
        /// <param name="userId">账号ID</param>
        /// <returns>[账号,密码]</returns>
        public JToken GetUserForId(string userId)
        {
            if (this.userConfig.ContainsKey(userId))
            {
                return this.userConfig[userId];
            }
            else { return null; }
        }

        /// <summary>
        /// 通过账号ID获取账号任务内容
        /// </summary>
        /// <param name="userId">账号ID</param>
        /// <returns>任务内容</returns>
        public JToken GetTaskForId(string userId)
        {
            JToken token = null;
            foreach (JToken item in this.tasksConfig)
            {
                if (item["账号ID"].ToString() == userId)
                {
                    token = item["账号ID"];
                }
            }
            return token;
        }
    }
}
